package com.lbj.yuanxi.yx001

import android.content.Context
import android.graphics.*
import android.view.View
import android.util.AttributeSet
import com.lbj.yuanxi.R

// 浮窗小球控件
class FloatingWindowView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {

    // 定义小球大小
    private val floatingWidth = 150
    private val floatingHeight = 150
    private var circlePaint = Paint()
    private var textPaint = Paint()
    private var contentText = "55%"
    private var drag = false
    private var bitmap: Bitmap

    init {
        // 设置圆球画笔属性
        circlePaint.color = Color.GREEN
        circlePaint.isAntiAlias = true

        // 设置文字画笔属性
        textPaint.color = Color.BLACK
        textPaint.isAntiAlias = true
        // 伪粗体（ fake bold ），因为它并不是通过选用更高 weight 的字体让文字变粗，而是通过程序在运行时把文字给「描粗」了。
        // 比真正的粗体要细一点
        textPaint.isFakeBoldText = true
        textPaint.textSize = 48.0f

        // 创建一个Bitmap
        val src = BitmapFactory.decodeResource(resources, R.drawable.cat)
        /**
         * 创建一个缩放的Bitmap，与小球大小一致
         *
         * 参数1：Bitmap对象
         * 参数2/3：Bitmap宽高
         * 参数4：是否保留Bitmap状态
         */
        bitmap = Bitmap.createScaledBitmap(src, floatingWidth, floatingHeight, true)
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        setMeasuredDimension(floatingWidth, floatingHeight)
    }

    override fun onDraw(canvas: Canvas) {
        if (drag) {
            drawLogo(canvas)
        } else {
            drawPoint(canvas)
        }
    }

    private fun drawLogo(canvas: Canvas) {
        // left和top表示偏移量
        canvas.drawBitmap(bitmap, 0f, 0f, null)
    }

    private fun drawPoint(canvas: Canvas) {
        // 画圆
        canvas.drawCircle(
            width / 2.toFloat(),
            height / 2.0.toFloat(),
            floatingWidth / 2.toFloat(),
            circlePaint
        )

        // 通过画笔测量文字宽度
        val textWidth = textPaint.measureText(contentText)
        // 文字x的左坐标 = 圆球的宽度 / 2 - 文字宽度 / 2
        val dx = floatingWidth / 2 - textWidth / 2
        // 文字y的坐标（文字的基线坐标的y轴）
        val metrics = textPaint.fontMetrics
        val dy = floatingHeight / 2 - (metrics.ascent + metrics.descent) / 2

        /**
         * 画文字
         * 参数1：要画的文字
         * 参数2：文字的左起点坐标的x轴
         * 参数3：文字的基线的y坐标
         * 参数4：画笔
         */
        canvas.drawText(contentText, dx, dy, textPaint)
    }

    override fun performClick(): Boolean {
        return super.performClick()
    }

    fun setDrawLogo(b: Boolean) {
        drag = b
        // 刷新画布
        invalidate()
    }
}